home *** CD-ROM | disk | FTP | other *** search
/ EuroCD 3 / EuroCD 3.iso / Programming / SecalDemo / Projects / Examples / x_BallDemo.scl < prev    next >
Text File  |  1998-06-24  |  8KB  |  357 lines

  1. /******************************************************************************\
  2. **  Ball demo (uses Extension) for Secal                                      **
  3. **  Requires Kickstart 2                                                      **
  4. **  Try to change "BALLNUM" (0=auto ctrl)                                     **
  5. \******************************************************************************/
  6.  
  7.  
  8. go main;
  9.  
  10.  
  11. #-------------------------------------------------------------------------------
  12.  
  13.  
  14. def BALLNUM=0;                            # (INITIAL) NUMBER OF BALLS
  15. def CHANGETIME=300;                    # TIME FOR EACH PATTERN
  16.  
  17.  
  18. #-------------------------------------------------------------------------------
  19.  
  20.  
  21. include "inc/libcalls/exec.inc";
  22. include "inc/libcalls/graphics.inc";
  23. include "inc/lvos/graphics.inc";
  24.  
  25. include "inc/hardware/custom.inc";
  26. include "inc/intuition/screens.inc";
  27.  
  28. include "ext/ext.inc";                # INTERFACE FOR EXTENSION
  29. inclib "ext/ext.lib";                    # USE EXTENSION LIB
  30.  
  31.  
  32. def SysBase=[4.w].ul;
  33.  
  34.  
  35. /******************************************************************************\
  36. ************                      M A I N                           ************
  37. \******************************************************************************/
  38.  
  39.  
  40. obj GfxBase:ulong;
  41.  
  42. obj myscr,mymus,sincostable:ulong;
  43. obj scrwidth,xcenter,ycenter:word;
  44.  
  45.  
  46. #-------------------------------------------------------------------------------
  47.  
  48.  
  49. main:
  50. push d2;
  51.  
  52. d2:=0;
  53.  
  54. OpenLibrary("graphics.library",37); GfxBase:=d0;
  55. if GfxBase then
  56.     x_Init;                                            # INITIALIZE EXTENSION
  57.     if d0 then
  58.         x_GraphicsStart;                    # START GRAPHICS SUBSYSTEM
  59.         if d0 then
  60.             x_AudioStart(%1111);            # START AUDIO SUBSYSTEM
  61.             if d0 then
  62.  
  63.                 x_LoadFile("data/sincos.dat",0); sincostable:=a0;
  64.                 if sincostable then
  65.                     x_Scr_Open(0,0,0,3,"Secal Ball demo",@scrcolors,0); myscr:=a0;
  66.                     if myscr then
  67.                         x_Scr_AddBmp(myscr);        # ADD ANOTHER BUFFER
  68.                         if d0 then
  69.                             x_Mus_Load("data/mod.demomusic",%1111); mymus:=a0;
  70.                             if mymus then
  71.                                 x_Mus_Play(mymus,0);
  72.  
  73.                                 x_SetTaskPri(0,31);    # CHANGE TASKPRI FOR SMOOTH ACTION
  74.                                 call action; d2:=d0;
  75.                                 x_RevertTaskPri;    # REVERT TO PREVIOUS PRI
  76.  
  77.                                 x_Mus_Stop(mymus);
  78.                             ;
  79.                         ;
  80.                     ;
  81.                 ;
  82.             ;
  83.         ;
  84.         x_Done;                            # SHUT DOWN EXTENSION, LET IT CLEAN UP INSTEAD OF US, TOO
  85.                                                 # (SCREEN, MUSIC, ETC)
  86.     ;
  87.     CloseLibrary(GfxBase);
  88. ;
  89.  
  90. d0.l:=d2.w;
  91.  
  92. pop d2;
  93. rts;                                                            # MAIN
  94.  
  95.  
  96.  
  97. scrcolors:
  98. dc.l $000000,$ffeeff,$9900ff,$6611aa,$441188,$0033ff,$0022bb,$111166;
  99.                                                 # SCREEN COLORS IN THE RGB8 FORMAT OF THE EXTENSION
  100.  
  101.  
  102. #*******************************************************************************
  103.  
  104.  
  105. obj ballnumfinal,ballnumtemp:word;
  106.  
  107.  
  108.  
  109. #                                                                    D0=FINAL BALLNUM
  110.  
  111. action:
  112. push d2\a5;
  113.  
  114. a0:=myscr; a0:=x_scr(a0).screen;
  115. xcenter:=Screen(a0).Width/2;
  116. d0:=Screen(a0).Height-(Screen(a0).BarHeight+1);
  117. ycenter:=d0/2+(Screen(a0).BarHeight+1);            # 0,0 OFFSET
  118. a0:=myscr; scrwidth:=x_scr(a0).rowdiff;            # SCREEN WIDTH
  119.  
  120.  
  121. a5:=$dff000;                                        # GLOBAL CUSTOM PTR
  122.  
  123. call ballsinit;
  124.  
  125. ballnumfinal:=BALLNUM; ballnumtemp:=31;
  126. if ballnumfinal>5000 then ballnumfinal:=5000;;
  127.  
  128. WaitTOF;
  129. repeat
  130.     d2.l:=x_VBlankCnt;
  131.  
  132.     if ballnumfinal=0 then d0:=ballnumtemp; else d0:=ballnumfinal;;
  133.     call ballsframe;
  134.  
  135.     if ballnumfinal=0 then
  136.         if x_VBlankCnt<>d2+1 then
  137.             ballnumfinal:=ballnumtemp-14;
  138.             if ballnumfinal<20 then ballnumfinal:=20;;
  139.         else
  140.             if x_VBlankCnt and 1=0 then
  141.                 ballnumtemp:=ballnumtemp+1;
  142.             ;
  143.         ;
  144.     ;                                            # IF BALLNUM IS NOT FIXED,
  145.                                                 # SEE IF THE MACHINE CAN STILL KEEP UP
  146. until [$dff016] and $400=0;        # DIRTY CHECK FOR RIGHT MOUSE BUTTON
  147.  
  148. d0:=ballnumfinal;                        # RETURN THE ACTUAL NUMBER OF BALLS
  149.  
  150. pop d2\a5;
  151. rts;                                                            # ACTION
  152.  
  153.  
  154. /******************************************************************************\
  155. ************                     B A L L S                          ************
  156. \******************************************************************************/
  157.  
  158.  
  159. obj bufcount:word;
  160. obj workbufptr:ulong;
  161. obj screenbitplanes:ulong;
  162.  
  163. obj patchng:word;
  164. obj patptr:ulong;
  165.  
  166. obj x0,x1,y0,y1:word;
  167.  
  168. obj vx0,vx1,vy0,vy1:word;
  169. obj dx0,dx1,dy0,dy1:word;
  170.  
  171.  
  172. #*******************************************************************************
  173.  
  174.  
  175. ballsinit:
  176. [@workbuf0].l:=0; [@workbuf1].l:=0;
  177. workbufptr:=@workbuf0;            # BUFFER INIT
  178.  
  179. patchng:=0; patptr:=@patsource;        # PATTERN INIT
  180. rts;                                                            # BALLSINIT
  181.  
  182.  
  183. #-------------------------------------------------------------------------------
  184.  
  185.  
  186. # D0=BALLNUM
  187.  
  188. ballsframe:
  189. push d2;
  190. d2:=d0;
  191.  
  192. call changescreen;                        # SWAP SCREEN BUFFERS
  193.  
  194. if patchng=0 then
  195.     a0:=patptr;
  196.     vx0:=[a0+]; vx1:=[a0+]; vy0:=[a0+]; vy1:=[a0+];
  197.     dx0:=[a0+]; dx1:=[a0+]; dy0:=[a0+]; dy1:=[a0+];
  198.     if a0=@end_patsource then a0:=@patsource;;
  199.     patptr:=a0;
  200.  
  201.     x0:=0; x1:=0; y0:=0; y1:=0;
  202.     patchng:=CHANGETIME;                # GET NEXT PATTERN
  203. else
  204.     patchng:=patchng-1;
  205. ;                                                            # DECREMENT COUNTER
  206.  
  207. OwnBlitter;
  208. call clearballs;
  209. d0:=d2; call drawcalcballs;
  210. WaitBlit;
  211. DisownBlitter;                                # DO BALLS
  212.  
  213. x0:=x0+vx0; x1:=x1+vx1;
  214. y0:=y0+vy0; y1:=y1+vy1;
  215.  
  216. pop d2;
  217. rts;                                                            # BALLSFRAME
  218.  
  219.  
  220.  
  221. patsource:
  222. dc 11,8,36,20,80,32,200,128;
  223. dc $fff0,$10,$fff8,$ffec,$fe10,$208,$410,$414;
  224. dc $8,$10,$8,0,$3e0,$3e8,$3e8,$3e0;
  225. dc $10,$8,$8,$10,$208,$fc10,$fc10,$208;
  226. dc $8,$10,$8,$10,$d0,$d0,$c8,$c8;
  227. dc $4,$10,$c,$18,$1fc,$214,$fffc,$414;
  228. dc $8,$10,$8,$10,$ff34,$8,0,$d4;
  229. dc $8,$8,$8,$8,$238,$fc38,$38,$fe38;
  230. dc $fff1,$10,$f,$fff4,$fe08,$20a,$3ff,$408;
  231. dc $8,$8,$8,$8,$3e0,$fc00,$3e0,0;
  232. dc $8,$10,$8,$10,$d0,$c8,$c8,$d0;
  233. dc $8,$8,$fff8,$8,$3f0,$10,$3f0,$fff0;
  234. end_patsource:                                # LISSAJOUS PATTERNS
  235.  
  236.  
  237. #-------------------------------------------------------------------------------
  238.  
  239.  
  240. changescreen:
  241. WaitBlit;
  242.  
  243. x_Scr_ActivateBmp(myscr,bufcount,-1,-1);    # CHANGE SCR BUFS
  244. bufcount:=bufcount xor 1;            # FLIP PAGE ID
  245.  
  246. if bufcount=0 then
  247.     workbufptr:=@workbuf0;
  248.     x_Scr_GetBmp(myscr,0);
  249.     screenbitplanes:=x_bmp(a0).planes;
  250. else
  251.     workbufptr:=@workbuf1;
  252.     x_Scr_GetBmp(myscr,1);
  253.     screenbitplanes:=x_bmp(a0).planes;
  254. ;                                                            # GET WORK BUF
  255. rts;                                                            # CHANGESCREEN
  256.  
  257.  
  258. #-------------------------------------------------------------------------------
  259.  
  260.  
  261. clearballs:
  262. push a2\a6;
  263.  
  264. a2:=workbufptr; a6:=GfxBase;            # PRELOAD REGS
  265.  
  266. if [a2].l then
  267.     WaitBlit;
  268.     Custom(a5).bltcon0:=$100; Custom(a5).bltcon1:=0;
  269.     Custom(a5).bltdmod:=scrwidth/3-4;        # PRELOAD BLT REGS
  270.  
  271.     repeat
  272.         call a6+LVOWaitBlit;        # DIRECT CALL WITH LVO!
  273.         Custom(a5).bltdpt:=[a2+];            # POINTER FROM BUF
  274.         Custom(a5).bltsize:=(11*3) lsl 6 or 2;
  275.     until [a2].l=0;                        # ZERO INDICATES END OF BUF
  276. ;
  277.  
  278. pop a2\a6;
  279. rts;                                                            # CLEARBALLS
  280.  
  281.  
  282.  
  283.  
  284.  
  285. obj dcb_counter:word;
  286.  
  287.  
  288.  
  289. # D0=BALLNUM
  290.  
  291. drawcalcballs:
  292. push d2\d3\d4\d5\a2\a3\a4\a6;
  293. dcb_counter:=d0;
  294.  
  295. a2:=workbufptr;
  296. d2:=x0; d3:=x1; d4:=y0; d5:=y1;
  297. a3:=sincostable; a4:=a3+$800; a6:=GfxBase;    # PRELOAD REGS
  298.  
  299. WaitBlit;
  300. Custom(a5).bltafwm:=-1; Custom(a5).bltalwm:=0;
  301. Custom(a5).bltamod:=-2; Custom(a5).bltbmod:=-2;
  302. Custom(a5).bltcmod:=scrwidth/3-4;
  303. Custom(a5).bltdmod:=scrwidth/3-4;        # PRELOAD BLT REGS
  304.  
  305. for dcb_counter:=dcb_counter-1 downto 0 do
  306.     d0:=(d4 and $fff) << 1; d1:=[a4+d0.w];
  307.     d0:=(d5 and $fff) << 1; d1:=d1+[a4+d0.w];
  308.     d1:=d1 asr 3+ycenter;
  309.     a0:=d1.w*scrwidth;                    # LISSAJOUS CALCS
  310.  
  311.     d0:=(d2 and $fff) << 1; d1:=[a3+d0.w];
  312.     d0:=(d3 and $fff) << 1; d1:=d1+[a3+d0.w];
  313.     d1:=d1 asr 2+xcenter;
  314.     a0:=a0+(d1.w lsr 3) and -2;            # LISSAJOUS CALCS
  315.  
  316.     d1:=d1 lsl 12;
  317.     a0:=screenbitplanes+a0; [a2+].l:=a0;        # STORE PLANEPTR FOR CLEAR
  318.  
  319.     call a6+LVOWaitBlit;            # DOCUMENTED TO PRESERVE ALL REGS!
  320.  
  321.     Custom(a5).bltcon1:=d1;
  322.     d1:=d1 or $fca; Custom(a5).bltcon0:=d1;
  323.     Custom(a5).bltcpt:=a0; Custom(a5).bltdpt:=a0;
  324.     Custom(a5).bltapt:=@ballmaskdata;
  325.  
  326.     if dcb_counter and 1 then Custom(a5).bltbpt:=@balldata0;
  327.     else Custom(a5).bltbpt:=@balldata1;;
  328.     Custom(a5).bltsize:=(11*3) lsl 6 or 2;    # START BLIT
  329.  
  330.     d2:=d2+dx0; d3:=d3+dx1;
  331.     d4:=d4+dy0; d5:=d5+dy1;
  332. ;                                                            # PROCESS EVERY BALL
  333. [a2].l:=0;                                    # TERMINATING 0!
  334.  
  335. pop d2\d3\d4\d5\a2\a3\a4\a6;
  336. rts;                                                            # DRAWCALCBALLS
  337.  
  338.  
  339. #*******************************************************************************
  340.  
  341.  
  342. data_c;
  343.  
  344. ballmaskdata:                        incbin "data/ball_b_mask";
  345. balldata0:                            incbin "data/ball_b_0";
  346. balldata1:                            incbin "data/ball_b_1";
  347.  
  348.  
  349. bss;
  350.  
  351. workbuf0:                             ds.l 5000;
  352. workbuf1:                                ds.l 5000;        # BUFFER FOR POINTERS
  353.  
  354.  
  355. #*******************************************************************************
  356.  
  357.